/**
 * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
 * @file      Customer.h
 * @author    Fortiortech  Appliction Team
 * @note      Last modify author is Marcel He
 * @since     2019-05-17
 * @date      2022-07-14
 * @brief     This file contains customer parameter used for Motor Control.
 */

#ifndef __CUSTOMER_H_
#define __CUSTOMER_H_

/* ---------------------------------------芯片参数值------------------------------------------ */
#define PWM_FREQUENCY (16.0)               // (kHz) 载波频率
#define PWM_DEADTIME  (0.8)                // (us) 死区时间
#define MIN_WIND_TIME (PWM_DEADTIME + 0.8) // (us) 单电阻最小采样窗口，建议值死区时间+0.9us
#define DLL_TIME      (PWM_DEADTIME + 0.0) // (us) 双电阻最小脉宽设置, 建议值为死区时间值+0.2us以上
/* ---------------------------------------电机参数值----------------------------------------- */
#define Pole_Pairs       (2.0)      // 极对数
#define RS               (0.085)    // 电机相电阻/2, ohm
#define LD               (0.000100) // D轴电机相电感/2,H
#define LQ               (LD)       // Q轴电机相电感/2,H
#define MOTOR_SPEED_BASE (20000.0)  // (RPM) 速度基准
/* ---------------------------------------观测器参数----------------------------------------- */
// 若选择AO自适应观测器 则无需填写Ke
#define KeVpp (1.832)                             // (V)      反电动势测量的峰峰值
#define KeT   (68.40)                             // (ms)     反电动势测量的周期
#define Ke    (Pole_Pairs * KeVpp * KeT / 207.84) // (V/KRPM) 反电动势常数
/* ------------------------------------电机驱动电路参数-------------------------------------- */
/**
 * 硬件PCBA参数设置根据驱动芯片的类型选择，6866为 HIGH_LEVEL
 * @param (HIGH_LEVEL)   驱动高电平有效
 * @param (LOW_LEVEL)    驱动高电平有效
 * @param (UP_H_DOWN_L)  驱动高电平有效
 * @param (UP_L_DOWN_H)  驱动高电平有效
 */
#define PWM_LEVEL_MODE (HIGH_LEVEL)   // 驱动电平设置
#define HW_AMP_MODE    (AMP_PGA_DUAL) // 运放模式选择 AMP_NOMAL - 外部放大;AMP_PGA_DUAL - 内部放大
#define HW_RSHUNT      (0.040)        // (Ω)  采样电阻
#define HW_AMPGAIN     (AMP8x)        // 放大倍数设置 AMP8x - x 为放大倍数，可选（2、4、8、16……）

/**
 * 参考电压设置
 * @param (VREF3_0)       参考电压设置为3.0V
 * @param (VREF4_0)       参考电压设置为4.0V
 * @param (VREF4_5)       参考电压设置为4.5V
 * @param (VREF5_0)       参考电压设置为5.0V
 */
#define HW_ADC_VREF (VREF5_0) // (V)  ADC参考电压

/**
 * 电流采样模式选择
 * @param (Single_Resistor)       单电阻电流采样模式
 * @param (Double_Resistor)       双电阻电流采样模式
 * @param (Three_Resistor)        三电阻电流采样模式
 */
#define Shunt_Resistor_Mode  (Single_Resistor) // 电流采样模式选择
#define SVPWM_COMMOM         (0xA0)            // 常规单电阻采样
#define SVPWM_OPTIM          (0xB0)            // 优化后新单电阻采样
#define Single_Resistor_Mode (SVPWM_OPTIM)     // 电流采样模式选择

/**
 * 基准电压VREF对外输出使能
 * @param (Disable)       禁止
 * @param (Enable)       使能
 */
#define VREF_OUT_EN (Enable) // 基准电压VREF对外输出使能

/**
 * 偏置电压设置
 * @param (VHALF1_8)        VHALF电压设置为1/8VREF
 * @param (VHALF1_4)        VHALF电压设置为1/4VREF
 * @param (VHALF25_64)      VHALF电压设置为25/64VREF
 * @param (VHALF1_2)        VHALF电压设置为1/2VREF
 */
#define HW_VHALF_SEL (VHALF1_2) // 偏置电压设置

/**
 * VHALF输出使能
 * @param (Disable)       	禁止
 * @param (Enable)        	使能
 */
#define VHALF_OUT_EN (Enable) // VHALF输出使能

/// 母线电压采样相关硬件参数
#define RV1 (200.0) // (kΩ) 母线电压分压电阻1
#define RV2 (33.0)  // (kΩ) 母线电压分压电阻2

#define VOLTAGE_MODE (EXTERNAL) // 母线电压选择使用分压通道，INTERNAL内部分压 内部分压2/13(默认)  EXTERNAL外部分压

/* ---RV分压比例系数  Ratio_12 ：母线分压系数为1:12，   Ratio_6_5 ：母线分压系数为1:6.5  -----    ((RV1 + RV2 + RV3) /
 * RV3)  */
/**
 * RV分压比例系数
 * @param (Ratio_12)       母线分压系数为1:12    RV: 12
 * @param (Ratio_6_5)      母线分压系数为1:6.5   RV：6.5
 */
#define VOLTAGE_SCALE (Ratio_6_5)

#define Calib_Time (1000) // 校正次数，固定1000次，单位:次

/* --------------------------------------- 预充电 ----------------------------------------- */

#define CHARGE_EN   (Disable) // 预充电使能 Enable - 使能 Disable - 禁止
#define CHARGE_DUTY (0.1)     // (%)  预充电下桥Duty
#define CHARGE_TIME (30)      // (ms) 预充电时间

/* IPM测试模式，用以检测MCU——MOS间电路是否正常。需要开启预充电 */
#define IPMTEST (Disable) // Enable - 使能 Disable - 禁止

/* 正常运行时估算算法的参数设置值  */
#define OBS_KSLIDE _Q15(0.85) // SMO算法里的滑膜增益值
#define E_BW       (2500.0)   // PLL算法里的反电动势滤波值

/* ------------------------------------- 顺逆风检测 ---------------------------------------- */
/**
 * 顺逆风检测方式
 * @param (NoTailWind)      无逆风顺风判断
 * @param (RSDMethod)       RSD比较器方法
 * @param (BEMFMethod)      BEMF比较器方法
 * @param (FOCMethod)       FOC计算方法
 */
#define TAILWIND_MODE (NoTailWind) // 检测方式选择
#define TAILWIND_TIME (800)        // (ms) 顺逆风检测时间
#define ATO_BW_WIND   (20)         // 逆风判断观测器带宽的滤波值，经典值为8.0-100.0
#define SPD_BW_WIND   (20.0)       // 逆风判断速度带宽的滤波值，经典值为5.0-40.0

/* 逆风顺风检测电流环 KP、KI */
#define DQKP_TailWind       _Q12(1.5)     // FOC计算顺逆风检测电流环KP
#define DQKI_TailWind       _Q15(0.5)     // FOC计算顺逆风检测电流环KI
#define TAILWIND_SMOMIN_RPM (10000.0)     // (RPM) 顺逆风 SMO 运行最小转速 MOTOR_SPEED_BASE的一半左右 */
#define IQ_TailWind_CURRENT I_Value(0.75) // (A) 顺风启动Q轴运行电流

/* --------------------------------------- 预定位 ----------------------------------------- */
/**
 * 预定位模式选择
 * @param (ALIGN_DSIABLE)       禁止
 * @param (ALIGN_NOMAL)         正常预定位
 * @param (ALIGN_TEST)          测试模式，可用于手动测试电机极对数
 */
#define ALIGN_MOME                (ALIGN_DSIABLE) // 预定位模式
#define DQKP_Alignment            _Q12(0.5)       // 预定位的KP
#define DQKI_Alignment            _Q15(0.2)       // 预定位的KI
#define Align_Angle_CW            (-18.0)         // (°) 预定位角度
#define Align_Angle_CCW           (13.3)          // (°) 预定位角度
#define Align_Angle_End           (-2.35)         // (°) 预定位角度
#define Align_Time                (20)            // (ms) 预定位时间
#define ID_Align_CURRENT          I_Value(16.8)   // (A) Q轴运行电流
#define UD_Align_Duty             _Q15(0.10)      // (A) D轴定位电压
#define UD_Align_Duty_Voltage     UDC_Value(12.0) // (A) 标准运行电压
#define UD_Align_Duty_Max         _Q15(0.127)     // (A) D轴定位电压最大值
#define UD_Align_Duty_Max_Voltage UDC_Value(9.0)  // (A) 最小运行电压，对应D轴定位电压最大值
#define UD_Align_Duty_Min         _Q15(0.09)      // (A) D轴定位电压最小值
#define UD_Align_Duty_Min_Voltage UDC_Value(18.0) // (A) 最大运行电压，对应D轴定位电压最小值
#define UQ_Align_Duty             _Q15(0.00)      // (A) Q轴定位电压

/* ------------------------------------- 启动配置 ----------------------------------------- */
/* 开环启动模式选择*/
#define Open_Start_Mode (Omega_Start) // Open_Start - 强拖启动 Omega_Start - Omega启动

/* 启动电流 */
#define ID_Start_CURRENT I_Value(0.0) // (A) D轴启动电流
#define IQ_Start_CURRENT I_Value(5.0) // (A) Q轴启动电流

/* 运行电流 */
#define ID_RUN_CURRENT I_Value(0.0)              // (A) D轴运行电流
#define IQ_RUN_CURRENT (IQ_Start_CURRENT * 0.95) // (A) Q轴运行电流

/* ATO爬坡参数 */
#define ATO_BW_START (10.0) // 观测器带宽的滤波值 [1.0-200.0]
#define ATO_BW_RUN1  (20.0)
#define ATO_BW_RUN2  (40.0)
#define ATO_BW_RUN3  (60.0)
#define ATO_BW_RUN4  (100.0)

/* 启动ATO爬坡时间控制 */
#define ATO_START_HOLDTIME (100) // (ms)观测器带宽的滤波值,启动第一拍ATO持续时间
#define ATO_RAMP_PERIOD    (10)  // (ms)观测器带宽的滤波值,ATO爬坡递增间隔时间

/* OMEGA启动参数 */
#define MOTOR_OMEGA_RAMP_ACC (5)            // omega启动的增量（每个载波递增值）
#define MOTOR_OMEGA_RAMP_MIN S_Value(50.0)  // (RPM) omega启动的最小切换转速
#define MOTOR_OMEGA_RAMP_END S_Value(150.0) // (RPM) omega启动的限制转速

/* 启动切换运行状态参数 */
#define MOTOR_SPEED_SMOMIN_RPM (25.0)         // (RPM) SMO运行最小转速影响启动
#define MOTOR_LOOP_RPM         S_Value(200.0) // (RPM) 启动后电流环切入外部环路转速阈值
#define SPD_BW                 (10.0)         // 速度带宽的滤波值，经典值为5.0-40.0

/* ------------------------------------- 运行配置 ----------------------------------------- */
#define DKP _Q12(0.80) // 运行DQ轴电流环KP
#define DKI _Q15(0.08) // 运行DQ轴电流环KI
#define QKP _Q12(0.80) // 运行DQ轴电流环KP
#define QKI _Q15(0.08) // 运行DQ轴电流环KI

/* D轴参数设置 */
#define DOUTMAX _Q15(0.6)  // D轴电压最大限幅值，单位：输出占空比
#define DOUTMIN _Q15(-0.6) // D轴电压最小限幅值，单位：输出占空比

/* Q轴参数设置 */
#define QOUTMAX _Q15(0.8)  // Q轴电压最大限幅值，单位：输出占空比
#define QOUTMIN _Q15(-0.8) // Q轴电压最小限幅值，单位：输出占空比

/* ---------------------------------外环环路参数设置----------------------------------------*/
/**
 * 外环闭环方式选择
 * @param (CURRENT_LOOP_CONTROL)       电流环
 * @param (SPEED_LOOP_CONTROL)         速度环
 * @param (POWER_LOOP_CONTROL)         功率环
 * @param (UQ_LOOP_CONTROL)            UQ环
 */
#define MOTOR_CTRL_MODE (CURRENT_LOOP_CONTROL)

/* 速度环爬坡增量 */
#if (MOTOR_CTRL_MODE == SPEED_LOOP_CONTROL)
#    define RAMP_INC S_Value(30.0)
#    define RAMP_DEC S_Value(30.0)

/* 电流环爬坡增量 */
#elif (MOTOR_CTRL_MODE == CURRENT_LOOP_CONTROL)
#    define RAMP_INC I_Value(0.1)
#    define RAMP_DEC I_Value(0.1)
#endif

/* 外环环调节周期 */
#define LOOP_TIME (1) // (ms) 默认为 1ms

/* 外环环调节 PID 参数*/
#define SKP _Q12(0.20) // 外环KP
#define SKI _Q15(0.01) // 外环KI
#define SKD _Q12(0.00) // 外环KD

/* 外环输出限值 */
#define SOUTMAX I_Value(15.0) // (A) 外环电流最大限幅值
#define SOUTMIN I_Value(0.08) // (A) 外环电流最小限幅值

#define FG_K (1.0)

/* 估算器模式选择 */
#define EstimateAlgorithm (AO) // AO - 自适应 PLL - 锁相环 SMO - 滑膜

/* 过调制 */
#define OverModulation (Disable) // 开启过调制UD,UQ会被放大1.15倍，但极限状态可能导致电流畸变

/* 旋转方向设置 */
#define FR_MODE (CCW) // 转向设置 CW - 顺时针 CCW 逆时针

/* 初始位置检测 */
#define PosCheckEnable (Disable)

/* ----------------------------------停机刹车选择------------------------------------ */
#define StopBrakeFlag        (1)
#define StopWaitTime         (1000)       // (ms) 刹车等待时间
#define Stop_MOTOR_SPEED_RPM S_Value(250) // (RPM) 小于该转速刹车

#endif
